<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>递归深拷贝</title>
</head>
<body>
    <script>
        // 1. 如果拷贝的是一个对象 或者是 数组 ，先创建对应容器 {} []，在拷贝
        // 2. 如果是其他数据类型，直接赋值

        // 深拷贝一个对象
        // return 拷贝完对象
        const school = {
            age:18,
            name:'atguigu',
            positions:['北京','上海','西安','深圳','武汉'],
            boss:{
                name:'刚哥',
                age:46
            },
            teach:function(){
                console.log('coding！');
            }
        }
        
        function deepClone(obj){
            // 判断的方式，来区分 对象数组一伙，其他是一伙
            if(typeof obj != 'object' && obj != null){
                return obj;
            }
            // 要么是数组，要么是对象
            let result = obj instanceof Array ? [] : {};
            // 无论数组还是对象，都支持for in循环
            for(let attr in obj){
                // 1 age    18
                // 2 name   atguigu
                // 3 boss   {name:'刚哥', age:46}
                if(typeof obj != 'object' && obj != null){
                    result[attr] = obj[attr];
                }else{
                    result[attr] = deepClone(obj[attr]);
                }
                
            }
            return result;
        }

        let newObj = deepClone(school);

        newObj.boss.name = '刚哥123123';
        newObj.positions[0] = 'beijing';
        console.log('newObj',newObj);
        console.log('school',school);

        // console.log(typeof {});// object
        // console.log(typeof []);// object

        // console.log(typeof null);// object


        // console.log(typeof 1);
        // console.log(typeof '1');
        // console.log(typeof function(){});
        // console.log(typeof undefined);
    </script>
</body>
</html>